package string;

import org.junit.Test;

/**
 * 实验显示，使用String拼接字符串，与StringBuilder、StringBuffer的耗时对比，在10万数据以后，会大幅度提高。
 */
public class String_Test {


	@Test
	public void test1() {
		new StringBuilder();
		//StringBuffer是线程安全的，是因为在所有操作的方法上都暴力的加上了 synchronized
		new StringBuffer();
	}

	@Test
	public void test2() {
		String str_1 = new String("ab");
		String str_2 = new String("ab");
		String str_3 = "ab";//JVM编译器做了优化，不会再创建对象
		String str_4 = "ab";

		/*
		 1. == 基础类型对比的是值，引用类型对比的是地址。equal对比的是哈希值
		 2. intern() 是把值推进常量池
		 */
		System.out.println(str_1 == str_2);//两个new出来的对象，对比的是地址，false
		System.out.println(str_1 == str_2.intern());//对象与值对比，false
		System.out.println(str_1.intern() == str_2.intern());//值与值对比，true
		System.out.println(str_1 == str_3);//对象与值对比，false
		System.out.println(str_1.intern() == str_3);//值与值对比，true
		System.out.println(str_3 == str_4);//值与值对比，true
	}

	/**
	 * String 将 31作为乘数因为：
	 * 1.31 是一个奇质数，如果选择偶数会导致乘积运算时数据溢出。
	 * <p>
	 * 2.另外在二进制中，2个5次方是32，那么也就是 31 * i == (i << 5) - i。
	 * 这主要是说乘积运算可以使用位移提升性能，同时目前的JVM虚拟机也会自动支持此类的优化。
	 * <p>
	 * 3.31的碰撞概率比较低
	 */
	@Test
	public void test3() {
		String str = "sfkwlefe2";
		str.hashCode();
	}

	public void test4() {
		StringBuilder sb = new StringBuilder();
		sb.append("1231").append("2sdf");
	}

	@Test
	public void test5() {
		String s = "1001，1002";
		String prefix = "，";
		if (s.startsWith(prefix)) {
			s = s.substring(prefix.length());
		}
		System.out.println(s);
	}

}
